#include "data.h"

void init()
{
    mpf_set_default_prec(PREC);
    init_prec();
}

void quit()
{
    clear_prec();
}


int main(int argc, char *argv[])
{
    init();

	int Seq_Paral;	/* Sequencial ou paralelo */
	int method; 	/* Método escolhido */
	mpf_t pi; 		/* Valor de pi durante as execuções */
	int iter; 		/* Número de iterações */
	int time;		/* Tempo de execuçao */

	mpf_init(pi);

	printf("Selecione o método para o cálculo de pi:\n");
	printf("BORWEIN:1	GAUSS_LEGENDRE:2	MONTE_CARLO:3\n");
	scanf("%d", &method);
	printf("SEQUENCIAL:1	PARALELO:2\n");
	scanf("%d", &Seq_Paral);

	struct timeval start, end; /* Variáveis para guardar o tempo atual */

    gettimeofday(&start, NULL); /* Pega o tempo antes da execução do algoritmo */

    /* Verifica o método */
    switch(method)
    {
        /* Borwein */
        case BORWEIN:
            if(Seq_Paral == SEQUENTIAL)
            {
                borwein(pi, iter);
            }
            else
            {
                borwein_paral(pi, iter);
            }
            break;

        /* Gauss-Legendre */
        case GAUSS_LEGENDRE:
            if(Seq_Paral == SEQUENTIAL)
            {
                gauss_legendre(pi, iter);
            }
            else
            {
                gauss_legendre_paral(pi, iter);
            }
            break;

        /* Monte Carlo */
        case MONTE_CARLO:
            if(Seq_Paral == SEQUENTIAL)
            {
                monte_carlo(pi, &iter);
            }
            else
            {
                monte_carlo_paral(pi, &iter);
            }
            break;
    }
	
	gettimeofday(&end, NULL); /* Pega o tempo depois da execução do algoritmo */

    time = end.tv_sec - start.tv_sec; /* time será diferença dada em segundos dos tempos */

	printf("\n\nTempo: %d\n", time);

	mpf_clear(pi);

    return 0;
}

